import json
from typing import Any, Dict

JSON_FILE = r'C:\pro\IT\Python\flaskPy\src\configsettings.json'


class myjson:
    def __init__(self, file_path=JSON_FILE):
        self.file_path = file_path

    def read(self):
        return read_json(self.file_path)

    def save(self, data):
        return save_json(data, self.file_path)

    def set_tree(self, new_tree):
        return set_tree_data(new_tree, self.file_path)

    def add_user_configer(self, new_configer):
        return add_user_configer(new_configer, self.file_path)

    def remove_user_configer_by_key(self, key_name):
        return remove_user_configer_by_key(key_name, self.file_path)

    def get_user_config_by_name(self, key_name):
        return get_user_config_by_name2(key_name, self.file_path)  # 修复：添加return

    def replace_user_config_by_name(self, keyname, newconfig):
        return replace_user_config_by_name(keyname, newconfig, self.file_path)


# 读取 JSON 文件
def read_json(file_path=JSON_FILE):
    try:
        with open(file_path, 'r', encoding='utf-8') as f:
            return json.load(f)
    except Exception as e:
        print(f"读取文件失败: {e}")
        return None


# 保存 JSON 文件
def save_json(data, file_path=JSON_FILE):
    try:
        # 使用with语句打开文件，确保文件操作完成后自动关闭，避免资源泄露
        with open(
                file_path,  # 文件路径，字符串类型，指定要写入的文件位置
                'w',  # 打开模式：'w'表示写入模式（如果文件已存在会覆盖内容）
                encoding='utf-8'  # 指定文件编码为UTF-8，支持中文等非ASCII字符
        ) as f:  # 将文件对象赋值给变量f

            # 使用json.dump()方法将Python对象转换为JSON格式并写入文件
            json.dump(
                data,  # 要序列化的Python数据对象（字典、列表等）
                f,  # 文件对象，指定写入的目标文件
                ensure_ascii=False,  # 关键参数：设置为False允许非ASCII字符（如中文）原样输出
                # 如果设置为True，中文字符会被转换为Unicode转义序列（如\u4e2d\u6587）
                indent=2  # 缩进参数：指定缩进空格数，使JSON文件格式美观易读
                # 设置为2表示使用2个空格进行层级缩进
                # 如果设置为None或0，则压缩输出（无换行和缩进）
            )
        return True
    except Exception as e:
        print(f"保存文件失败: {e}")
        return False


def set_tree_data(new_tree_data, file_path=JSON_FILE):
    if isinstance(new_tree_data, str):
        try:
            new_tree_data = json.loads(new_tree_data)
        except json.JSONDecodeError:
            print("treeData 格式错误，必须是合法的 JSON 字符串")
            return False

    data = read_json(file_path)
    if data is None:
        return False

    data['treeData'] = new_tree_data
    result = save_json(data, file_path)
    if result:
        print("treeData 已更新！")
    return result


def get_user_config_by_name2(config_name: str, file_path: str = JSON_FILE) -> Dict[str, Any] | None:
    print("get_user_config_by_name")
    print(file_path)
    data = read_json(file_path)
    if data is None:
        return None

    for item in data.get("userConfigers", []):
        if config_name in item:
            print("成功找到：" + config_name)
            return item[config_name]
    return None


def replace_user_config_by_name(config_name: str, new_config: Dict[str, Any], file_path: str = JSON_FILE) -> bool:
    data = read_json(file_path)
    if data is None:
        return False

    replaced = False
    for idx, item in enumerate(data.get("userConfigers", [])):
        if config_name in item:
            data["userConfigers"][idx] = new_config
            replaced = True
            break

    if replaced:
        return save_json(data, file_path)
    return False


def add_user_configer(new_configer, file_path=JSON_FILE):
    print("接收到的数据:", new_configer)
    print("数据类型:", type(new_configer))

    # 如果是字符串，先解析为字典
    if isinstance(new_configer, str):
        try:
            # 先尝试直接解析
            parsed_data = json.loads(new_configer)
            new_configer = parsed_data
            print("字符串解析成功")
        except json.JSONDecodeError:
            try:
                # 如果失败，处理转义字符
                unescaped_str = new_configer.replace('\\"', '"').replace('\\\\', '\\')
                parsed_data = json.loads(unescaped_str)
                new_configer = parsed_data
                print("转义字符串解析成功")
            except json.JSONDecodeError as e:
                print(f"new_configer 格式错误，无法解析: {e}")
                return False

    # 现在检查是否是字典
    if not isinstance(new_configer, dict):
        print("new_configer 必须是字典对象")
        return False

    # 读取现有数据
    data = read_json(file_path)
    if data is None:
        return False

    # 获取配置键名
    key_name = list(new_configer.keys())[0]
    print("配置键名:", key_name)

    # 检查是否已存在，如果存在则替换
    config_exists = any(key_name in item for item in data['userConfigers'])
    if config_exists:
        print(f"配置 {key_name} 已存在，执行替换")
        return replace_user_config_by_name(key_name, new_configer)
    else:
        print(f"配置 {key_name} 不存在，执行添加")
        data['userConfigers'].append(new_configer)
        return save_json(data, file_path)






def remove_user_configer_by_key(key_name, file_path=JSON_FILE):
    data = read_json(file_path)
    if data is None:
        return False

    original_len = len(data["userConfigers"])
    data["userConfigers"] = [item for item in data["userConfigers"] if key_name not in item]
    deleted_count = original_len - len(data["userConfigers"])

    print(f"已删除 {deleted_count} 个包含键名 '{key_name}' 的对象")

    if deleted_count == 0:
        return False
    else:
        return save_json(data, file_path)